/**
 * 将数组转换为键值对对象
 * @param {Array} arr - 包含键值对的数组
 * @param {string} keyField - 作为键的字段名
 * @param {string} valueField - 作为值的字段名
 * @returns {Object} 转换后的对象
 */
export const arrToObj = (arr, keyField = 'config_key', valueField = 'config_value') => {
    // 输入验证
    if (!Array.isArray(arr)) {
      throw new Error('arrToObj 期望接收数组作为第一个参数');
    }
    
    return arr.reduce((result, item) => {
      if (item && typeof item === 'object') {
        const key = item[keyField];
        const value = item[valueField];
        if (key !== undefined && value !== undefined) {
          result[key] = value;
        }
      }
      return result;
    }, {});
  };


  /**
   * @description 将字符串中的 JSON 字符串转换为对象
   * @param {*} obj - 包含 JSON 字符串的对象
   * @returns 
   */
  export function parseJsonFields(obj) {
    const result = {};
    for (const key in obj) {
      if (!obj.hasOwnProperty(key)) continue;
      const value = obj[key];
      // 如果是字符串，并且看起来像 JSON（以 { 或 [ 开头）
      if (typeof value === 'string' && (value.startsWith('{') || value.startsWith('['))) {
        try {
          result[key] = JSON.parse(value);
        } catch (e) {
          console.warn(`JSON parse failed for field: ${key}`, e);
          result[key] = value; // 保留原始值
        }
      } else {
        result[key] = value;
      }
    }
  
    return result;
  }


  /**
 * @param {Array} arr - 原始数据数组
 * @param {number|string} [pid=0] - 根节点父ID
 * @param {string} [idKey='id'] - ID字段名
 * @param {string} [pidKey='pid'] - 父ID字段名
 * @param {string} [childrenKey='children'] - 子节点字段名
 * @returns {Array} 树形结构数组
 */
export function buildTree(arr, pid = 0, idKey = 'id', pidKey = 'pid', childrenKey = 'children') {
  // 基础参数校验
  if (!Array.isArray(arr)) return [];
  
  const tree = [];
  
  for (let i = 0; i < arr.length; i++) {
    const item = arr[i];
    // 找到当前层级的节点
    if (item[pidKey] === pid) {
      // 递归查找子节点（通过slice创建子数组，避免重复遍历已处理项）
      const children = buildTree(arr.slice(i + 1), item[idKey], idKey, pidKey, childrenKey);
      
      // 有子节点则添加，避免空数组
      if (children.length) {
        item[childrenKey] = children;
      }
      
      tree.push(item);
    }
  }
  
  return tree;
}
